package br.com.almanach.persistencia.cadastro;

import br.com.almanach.dominio.cadastro.Membro;

import java.util.List;

import javax.ejb.Stateless;
import javax.ejb.LocalBean;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;

@Stateless
@LocalBean
public class MembroPersistencia {

    @PersistenceContext
    private EntityManager entityManager;

    public List<Membro> buscar(String nome, int registro , int quantidade){
        try{
            CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
            CriteriaQuery criteriaQuery = criteriaBuilder.createQuery();
            Root<Membro> membro = criteriaQuery.from(Membro.class);
            criteriaQuery.select(membro);
            if(nome != null){
                criteriaQuery.where(criteriaBuilder.like(membro.<String>get("nome"), nome+"%"));
            }
            return entityManager.createQuery(criteriaQuery).setFirstResult(registro).setMaxResults(quantidade).getResultList();

        }catch( NoResultException e ){
            return null;
        }
    }

    public int buscar(String nome){
        Number registros = null;
        try{
            CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
            CriteriaQuery criteriaQuery = criteriaBuilder.createQuery();
            Root<Membro> membro = criteriaQuery.from(Membro.class);
            criteriaQuery.select(membro);
            if(nome != null){
                criteriaQuery.where(criteriaBuilder.like(membro.<String>get("nome"), nome+"%"));
            }
            criteriaQuery.select(criteriaBuilder.count(membro));
            registros = (Number) entityManager.createQuery(criteriaQuery).getSingleResult();
            return registros == null ? 0 : registros.intValue();
        }catch( NoResultException e ){
            return 0;
        }
    }

    public Membro buscar(Integer id){
        return entityManager.find(Membro.class,id);
    }

    public void incluir(Membro membro){
        entityManager.persist(membro);
    }

    public void alterar(Membro membro){
        entityManager.merge(membro);
    }

    public void remover(Membro membro){
        entityManager.remove(entityManager.find(Membro.class,membro.getId()));
    }

}
